package com.qdxwx.data.service.user;

import com.qdxwx.common.page.PageRequest;
import com.qdxwx.models.manager.Manager;
import com.qdxwx.models.teacher.Teacher;
import com.qdxwx.models.user.User;
import com.qdxwx.models.user.UserQuery;
import com.qdxwx.models.user.UserToken;

import jakarta.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * Qdx NetSchool Platform
 * @author qdxwx
 * @updateTime 2022/5/25
 * @description
 */
public interface UserService {

	/**
	 * 创建用户
	 */
	int insert(User user);

	/**
	 * 通过用户ID查询用户
	 */
	User get(long userId);

	/**
	 * 从cookie字符串中获取
	 * @param loginCookie
	 * @return
	 */
	User getByCookie(String loginCookie);

	User getByToken(long userId, String token);

	User getByLoginName(String loginName);

	/**
	 * 通过邮箱号查询用户信息
	 */
	User getByEmail(String email);

	/**
	 * 通过手机号查询用户信息
	 */
	User getByMobile(String mobile);

	/**
	 * 通过账号查询用户信息
	 * @param loginName 手机，邮箱，登录名，用户Id
	 * @return
	 */
	User getByAccount(String loginName);

	/**
	 * 检测手机是否存在
	 */
	boolean isExistMobile(String mobile);

	/**
	 * 检测账户user_name是否存在
	 */
	boolean isExistLoginName(String userName);

	/**
	 * 检测邮箱号是否存在
	 */
	boolean isExistEmail(String email);

	/**
	 * 注册用户
	 */
	long register(HttpServletRequest request, User user);

	/**
	 * 更新登录时间，生成登录日志，并返回新的UserToken，不写Session,Cookie
	 */
	UserToken doLogin(HttpServletRequest request, User user);

	/**
	 * 修改用户密码
	 */
	void updateUserPwd(User user);

	/**
	 * 冻结或启用用户
	 */
	void updateUserStatus(User user);

	/**
	 * 修改用户头像
	 */
	void updateAvatar(User user);

	/**
	 * 修改用户信息
	 */
	int update(User user);

	/**
	 * 修改个中心个性化图片URL
	 */
	void updateUserBannerUrl(User user);

	/**
	 * 通过标识更新未读数加一
	 */
	void updateLetterCount(Long userId, int count);

	/**
	 * 通过标识更新未读数清零
	 */
	void resetLetterCount(Long userId);

	/**
	 * 更新用户的最后活动时间
	 */
	void updateLoginTime(long userId);

	List<User> getList(UserQuery query, PageRequest page);

	long count(UserQuery user);

	int deleteUserByIds(String ids);

    long insertByTeacher(Teacher teacher);

	long insertByManager(Manager manager);

	int combine(long targetId, long sourceId);

	int combine(long targetId, User sourceUser) throws RuntimeException;

	int updateMobile(User user);

	//获取最近学习用户列表，从学习历史中获取
	List<User> getLatelyStudentList(int courseId, PageRequest page);
	//获取最近学习用户列表，从学习历史中获取
	List<User> getLatelyStudentList(int courseId, int limit);
	//获取课程的所有学员
	List<User> getStudentList(int courseId, PageRequest page);
	//统计课程的所有学员
	int countStudent(int courseId);
	//获取我的所有学员
    List<User> getMyStudentList(long userId, PageRequest form);
	//统计我的所有学员
	int countMyStudent(long userId);
}
